package controller;

import dao.AlunoJpaController;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import dao.exceptions.NonexistentEntityException;
import java.util.ArrayList;
import model.Aluno;
import model.DisciplinaProfessor;
import model.Matriculado;
import model.Turma;
import pagecontroller.JsfUtil;

/**
 *
 * @author Edilson Fernandes da Costa
 * @version 1.0
 */
public class AlunoController extends Controller {

    public AlunoController() {
        if (JsfUtil.getObjectFromSession("AlunoJpaController") == null) {
            jpaController = new AlunoJpaController();
        } else {
            jpaController = (AlunoJpaController) JsfUtil.getObjectFromSession("AlunoJpaController");
        }
    }
    private Aluno aluno = null;
    private Aluno alunoAux = null;
    private AlunoJpaController jpaController = null;
    private List<Aluno> alunos = null;
    private String pesquisaAlunoNome;
    private DisciplinaProfessor pesquisaDisciplina;
    private Turma pesquisaTurma;
    private List<Aluno> pesquisaAalunos;
    private List<Turma> turmas;
    private String nomes;

    public String novo() {
        aluno = new Aluno();
        return "refreshPage";
    }

    public String setPageAlunoCad() {
        clear();
        getPageManager().setPageAlunoCad();
        return "refreshPage";
    }

    public String setPageAlunoPesquisa() {
        clear();
        getPageManager().setPageAlunoPesquisa();
        return "refreshPage";
    }

    public void clear() {
        pesquisaAalunos = null;
        pesquisaAlunoNome = null;
        alunos = null;
        aluno = null;
        turmas = null;
    }

    public String persiste() {
        if (aluno.getId() == null) {
            return create();
        } else {
            return update();
        }
    }

    public String update() {
        try {
            jpaController.edit(this.aluno);
            alunoAux = aluno;
            this.aluno = null;
            JsfUtil.addSuccessMessage("Aluno Atualizado com Sucesso");
            getPageManager().setPageAlunoRelat();
        } catch (NonexistentEntityException ex) {
            Logger.getLogger(AlunoController.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(AlunoController.class.getName()).log(Level.SEVERE, null, ex);
        }
        return "refreshPage";
    }

    public String create() {
        try {
            jpaController.create(aluno);
            alunoAux = aluno;
            aluno = null;
            JsfUtil.addSuccessMessage("Aluno cadastrado com sucesso.");

            getPageManager().setPageAlunoRelat();
        } catch (Exception e) {
            JsfUtil.ensureAddErrorMessage(e, "Ocorreu um erro na percistencia dos dados.");
            return null;
        }
        return "refreshPage";
    }

    public String edit() {
        Aluno alunoTemp = (Aluno) JsfUtil.getObjectFromRequestParameter("alunoTemp");
        setPageAlunoCad();
        this.aluno = alunoTemp;
        return "refreshPage";
    }

    public String load() {
        Aluno alunoTemp = (Aluno) JsfUtil.getObjectFromRequestParameter("alunoTemp");
        this.alunoAux = alunoTemp;
        getPageManager().setModalAlunoRelat();
        return "refreshPage";
    }

    public String destroy() {
        try {
            jpaController.destroy(alunoAux.getId());
            JsfUtil.addSuccessMessage("Aluno removido com sucesso.");
        } catch (NonexistentEntityException ex) {
            Logger.getLogger(AlunoController.class.getName()).log(Level.SEVERE, null, ex);
        }

        return "refreshPage";
    }

    public String editButton() {
        this.aluno = alunoAux;
        getPageManager().setPageAlunoCad();

        return "refreshPage";
    }

    public String destroyButton() {
        Aluno alunoTemp = alunoAux;
        try {
            jpaController.destroy(alunoTemp.getId());
            JsfUtil.addSuccessMessage("Aluno removido com sucesso.");
            alunoAux = null;
            getPageManager().setPageAlunoList();

        } catch (NonexistentEntityException ex) {
            Logger.getLogger(AlunoController.class.getName()).log(Level.SEVERE, null, ex);
        }

        return "refreshPage";
    }

    public Aluno getAluno() {
        if (aluno == null) {
            aluno = new Aluno();
        }
        return aluno;
    }

    public List<Aluno> getAlunos() {
        this.alunos = jpaController.findAlunoEntities();
        return this.alunos;
    }

    public AlunoJpaController getJpaController() {
        return jpaController;
    }

    public Aluno getAlunoAux() {
        return alunoAux;
    }

    public void setAlunoAux(Aluno alunoAux) {
        this.alunoAux = alunoAux;
    }

    public void setAluno(Aluno aluno) {
        this.aluno = aluno;
    }

    public List<Aluno> getPesquisaAalunos() {

        pesquisaAalunos = jpaController.findAlunoEntities();
        return pesquisaAalunos;
    }

    public void setPesquisaAalunos(List<Aluno> pesquisaAalunos) {
        this.pesquisaAalunos = pesquisaAalunos;
    }

    public String getPesquisaAlunoNome() {
        if (pesquisaAlunoNome == null) {
            pesquisaAlunoNome = "";
        }
        return pesquisaAlunoNome;
    }

    public void setPesquisaAlunoNome(String pesquisaAlunoNome) {
        this.pesquisaAlunoNome = pesquisaAlunoNome;
    }

    public DisciplinaProfessor getPesquisaDisciplina() {

        if (pesquisaDisciplina == null) {
            try {
                pesquisaDisciplina = getDisciplinaProfessorController().getDisciplinaProfessorLogado().get(0);

            } catch (Exception e) {
                pesquisaDisciplina = new DisciplinaProfessor();
            }
        }
        return pesquisaDisciplina;


    }

    public void setPesquisaDisciplina(DisciplinaProfessor pesquisaDisciplina) {
        this.pesquisaDisciplina = pesquisaDisciplina;
    }

    public Turma getPesquisaTurma() {
        if (pesquisaTurma == null) {
            try {
//                pesquisaTurma = getPesquisaDisciplina().getTurmas().get(0);
            } catch (Exception e) {
                pesquisaTurma = new Turma();
            }
        }
        return pesquisaTurma;
    }

    public void setPesquisaTurma(Turma pesquisaTurma) {
        this.pesquisaTurma = pesquisaTurma;
    }

    public String pesquisaSimples() {
        setPesquisaAalunos(jpaController.findAluno(getPesquisaAlunoNome()));
        return "refreshPage";
    }

    public String pesquisaAvancada() {

        for (Matriculado m : pesquisaTurma.getMatriculados()) {
            getPesquisaAalunos().add(m.getAluno());
        }

        return "refreshPage";
    }

    public List<Turma> getTurmas() {
        turmas = getTurmaController().getTurmas(getPesquisaDisciplina());
        return turmas;

    }

    public List<Turma> getTurmasAluno() {
        MatriculadoController matriculadoController = (MatriculadoController) JsfUtil.getObjectFromSession("MatriculadoController");
        if (matriculadoController == null) {
            matriculadoController = new MatriculadoController();
        }

        List<Matriculado> matriculados = matriculadoController.getMatriculados(getAlunoAux());

        List<Turma> turmasAluno = new ArrayList<Turma>();
        for (Matriculado m : matriculados) {
            turmasAluno.add(m.getTurma());
        }

        return turmasAluno;

    }

    public void setTurmas(List<Turma> turmas) {
        this.turmas = turmas;
    }

    public String getNomes() {
        return nomes;
    }

    public void setNomes(String nomes) {
        this.nomes = nomes;
    }

    public String persisteMassa() {

        List<String> lista = new ArrayList<String>();
        List<Aluno> alunos2 = new ArrayList<Aluno>();
        int inicio = 0;
        int fim = nomes.length();
        String nomes2 = nomes;
        
        //um aluno por linha
        while (true) {
            fim = nomes2.indexOf("\n");
            if (fim == -1) {
                break;
            }
            lista.add(nomes2.substring(inicio+1, fim));
            nomes2 = nomes2.substring(fim + 1, nomes2.length());
            if (nomes.length() <= fim) {
                break;
            }
        }
        
        
        for(String str:lista){
            Aluno a = new Aluno();
            if(str.indexOf("\t")>=0){
                a.setIdentificador(str.substring(0, str.indexOf("\t")));
                a.setNome(str.substring(str.indexOf("\t")+1, str.length()));
            }else{
                a.setNome(str);
            }
            alunos2.add(a);
        }
        
        for(Aluno a: alunos2){
            jpaController.create(a);
            JsfUtil.addSuccessMessage("Aluno "+a.getNome()+" Cadastrado com sucessos.");
        }
        return "refreshPage";
    }
}
